iTesting软件测试知识分享

Python多线程 -- Join

Python多线程 – Join

join([timeout])
Wait until the thread terminates. This blocks the calling thread until the thread whose join() method is called terminates – either normally or through an unhandled exception – or until the optional timeout occurs.

join方法,阻塞进程直到线程执行完毕。如果一个线程或者一个函数在执行过程中要调用另外一个线程,并且待到其完成以后才能接着执行,那么在调用这个线程时可以使用被调用线程的join方法。

下面通过一段代码来说明join是如何工作的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class ThreadExample_1(object):
def func(self,t):
print '%s--First method of thread -- start' %t
t.start()
t.join()
print 'First method of thread -- end'
class ThreadExample_2(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
time.sleep(2)
print 'second method of thread'
if __name__ == "__main__":
t2 = ThreadExample_2()
t1 = threading.Thread(target=ThreadExample_1().func, args=(t2,))
t1.start()

我们创建了2个子线程,一个t2, 一个t1,其中t1继承自ThreadExample_1,args为t2. 那么先来看下输出:
1
2
3
<ThreadExample_2(Thread-1, initial)>, First method of thread -- start
second method of thread
First method of thread -- end

可以看到, ThreadExample_2的一个实例即t2作为参数传入了主线程的func函数,在第一个print语句输出后,由start()调起了run()并成功进入join阻塞状态,接着,第二个print语句卡在哪里直到t2这个子线程执行完毕才打印出来。

为了进一步说明join的作用我们更改代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class ThreadExample_1(object):
def func(self,t):
print '%s, First method of thread -- start'%t
t.start()
t.join(1)
print 'First method of thread -- end'
class ThreadExample_2(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
time.sleep(2)
print 'second method of thread't2 = ThreadExample_2()
if __name__ == "__main__":
t2 = ThreadExample_2()
t1 = threading.Thread(target=ThreadExample_1().func, args=(t2,))
t1.start()

我们给join一个timeout时间1秒钟, 再来看下运行结果:
1
2
3
<ThreadExample_2(Thread-1, initial)>, First method of thread -- start
First method of thread -- end
second method of thread

可以看到由于join设置了timeout,导致子线程t2没有完成就被退出运行状态,所以主线程的第二个print语句先于t2的print打印出来。

🐶 您的支持将鼓励我继续创作 🐶
-------------评论, 吐槽, 学习交流,请关注微信公众号 iTesting-------------
请关注微信公众号 iTesting wechat
扫码关注,跟作者互动